
package jermedit.gui;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.HeadlessException;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import static java.awt.print.Printable.NO_SUCH_PAGE;
import static java.awt.print.Printable.PAGE_EXISTS;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
//import jermedit.gui.GuiJPanel;


public class PrinterDriver implements Printable {

  GuiJPanel thePane;

  public PrinterDriver(GuiJPanel p) {
    PrinterJob pJob = PrinterJob.getPrinterJob();
    thePane = p;
    System.out.println(thePane.getArea().width);
    System.out.println(thePane.getArea().height);
    pJob.setPrintable(this);
    try {
      if (pJob.printDialog()) {
        pJob.print();
      }
    }catch (HeadlessException e) {
        e.printStackTrace();
    }catch (PrinterException e) {
        e.printStackTrace();
    }
//    } catch (HeadlessException | PrinterException e) {
//      e.printStackTrace();
//    }
  }

  @Override
  public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {
    Graphics2D g2d = (Graphics2D) graphics;
    Font printFont = new Font("Arial", Font.PLAIN, 14);
    g2d.setFont(printFont);
    
    double pWidth = pageFormat.getImageableWidth();
    double pHeight = pageFormat.getImageableHeight();
    System.out.println("***" + pageIndex + "***");
    System.out.println("Drucker:   Breite-Höhe" + pWidth + " " + pHeight);
    System.out.println("Zeichnung: Breite-Höhe" + thePane.getArea().width + "-" + thePane.getArea().height);

    int anzSeitenBreite = (int) (thePane.getArea().width  / pWidth) + 1;
    int anzSeitenHoehe = (int) (thePane.getArea().height / pHeight) + 1;
    System.out.println("AnzSeiten B X H:" + anzSeitenBreite + " X " + anzSeitenHoehe);

    int pages = anzSeitenBreite * anzSeitenHoehe;
    if (pageIndex > pages) {
      return NO_SUCH_PAGE;
    }
    

 
    //Verschieben des Druckbereichs - zur Darstellung mehrerer Seiten

   
    int spalte = pageIndex % anzSeitenBreite;
    int zeile = pageIndex / anzSeitenBreite;

    g2d.translate(pageFormat.getImageableX() - pWidth * spalte, //in die Breite
            pageFormat.getImageableY() -pHeight * zeile);  // in die Hoehe
    System.out.println("translate:" + pWidth * spalte + " "
            + pHeight * zeile);
    
    // Anm: mit g2d.scale(..) könnte man vergroessern, verkleinern

    thePane.paintComponent(graphics);  // Benutzung der Paint-Methode

    return PAGE_EXISTS;
  }
}